home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Mail / MailEnclosure / Source.v0.15 / support.m < prev    next >
Text File  |  1995-06-12  |  3KB  |  116 lines

  1. #include "support.h"
  2. #include <stdio.h>
  3.  
  4. #define ENCODE(c) ((c) ? ((c) & 077) + ' ': '`')
  5.  
  6. int uuencode(const char *name, const char *inFileName, FILE *fpOut, short mode)
  7. {
  8.    char buf[80];
  9.    int i, n;
  10.    FILE *fpIn;
  11.  
  12.    fpIn = fopen(inFileName, "r");
  13.    if(!fpIn)
  14.        return 0;
  15.  
  16.    fprintf(fpOut, "begin %o %s\n", mode, name);
  17.    while(1)
  18.    {
  19.       n = fread(buf, 1, 45, fpIn);
  20.  
  21.       putc(ENCODE(n), fpOut);
  22.       for (i=0; i<n; i += 3)
  23.       {
  24.      fputc(ENCODE(buf[i] >> 2), fpOut);
  25.      fputc(ENCODE(((buf[i] << 4) & 060) | ((buf[i + 1] >> 4) & 017)), fpOut);
  26.      fputc(ENCODE(((buf[i + 1] << 2) & 074) | ((buf[i + 2] >> 6) & 03)), fpOut);
  27.      fputc(ENCODE(buf[i + 2] & 077), fpOut);
  28.       }
  29.       putc('\n', fpOut);
  30.       if (n <= 0)
  31.       break;
  32.    }
  33.    fputs("end\n", fpOut);
  34.    fclose(fpIn);
  35.    fflush(fpOut);
  36.    return 1;
  37. }
  38.  
  39. /*
  40.  * to64 -- a filter from ascii to base64 encoding, from the
  41.  *      metamail distribution.
  42.  */
  43. /*
  44. Copyright (c) 1991 Bell Communications Research, Inc. (Bellcore)
  45.  
  46. Permission to use, copy, modify, and distribute this material 
  47. for any purpose and without fee is hereby granted, provided 
  48. that the above copyright notice and this permission notice 
  49. appear in all copies, and that the name of Bellcore not be 
  50. used in advertising or publicity pertaining to this 
  51. material without the specific, prior written permission 
  52. of an authorized representative of Bellcore.  BELLCORE 
  53. MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY 
  54. OF THIS MATERIAL FOR ANY PURPOSE.  IT IS PROVIDED "AS IS", 
  55. WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
  56. */
  57.  
  58. static char basis_64[] =
  59.    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  60.  
  61.  
  62. void output64chunk(int c1, int c2, int c3, int pads, FILE *outfile)
  63. {
  64.     (void) putc(basis_64[c1>>2], outfile);
  65.     (void) putc(basis_64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)], outfile);
  66.     if (pads == 2) {
  67.         (void) putc('=', outfile);
  68.         (void) putc('=', outfile);
  69.     } else if (pads) {
  70.         (void) putc(basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)], outfile);
  71.         (void) putc('=', outfile);
  72.     } else {
  73.         (void) putc(basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)], outfile);
  74.         (void) putc(basis_64[c3 & 0x3F], outfile);
  75.     }
  76. }
  77.  
  78. void to64(FILE *infile, FILE *outfile) 
  79. {
  80.     int c1, c2, c3, ct=0;
  81.     while ((c1 = getc(infile)) != EOF) {
  82.         c2 = getc(infile);
  83.         if (c2 == EOF) {
  84.             output64chunk(c1, 0, 0, 2, outfile);
  85.         } else {
  86.             c3 = getc(infile);
  87.             if (c3 == EOF) {
  88.                 output64chunk(c1, c2, 0, 1, outfile);
  89.             } else {
  90.                 output64chunk(c1, c2, c3, 0, outfile);
  91.             }
  92.         }
  93.         ct += 4;
  94.         if (ct > 71) {
  95.             (void) putc('\n', outfile);
  96.             ct = 0;
  97.         }
  98.     }
  99.     if (ct) (void) putc('\n', outfile);
  100.     (void) fflush(outfile);
  101. }
  102.  
  103. /* End of Bellcore material. */
  104.  
  105. int base64(const char *inFileName, FILE *fp)
  106. {
  107.    FILE *fpIn;
  108.  
  109.    fpIn = fopen(inFileName, "r");
  110.    if(!fpIn)
  111.        return 0;
  112.    to64(fpIn, fp);
  113.    fclose(fpIn);
  114.    return 1;
  115. }
  116.